package tp1
import scala.collection.mutable.HashMap

class Foja() {
	var notas:List[Cursada] = Nil
  
	def actualizarFoja(cursada:Cursada){
	  this.notas :+ cursada
	}
	
	def cursadasAprobadas():Int ={
	 var lista = this.notas.filter(this.esAprobada(_))
     lista.foldLeft(0)((acum, elem) => {acum + 1})
	}
	
	def cursosAbandonados():Int ={
		var lista = this.cursadasQueAbandono()
		lista.foldLeft(0)((acum, elem) => {acum + 1})
	}
	
	def cursosAprobadoSobreIniciados():Float = {
	  (this.cursadasAprobadas()*100) / this.notas.length
	}
	
	def promedioConAplazos():Double = {
	  var lista = this.cursadasTerminadas
	  var sumaDeNotas = lista.foldLeft(0)((acum, elem) => {acum + elem.calificacion})
	  sumaDeNotas / lista.length
	}
	
	def promedioSinAplazos():Double = {
	  var lista = this.notas.filter(this.esAprobada(_))
	  var sumaDeNotas = lista.foldLeft(0)((acum, elem) => {acum + elem.calificacion})  
	  sumaDeNotas / lista.length
	}
	
	def tablaDeNotas():HashMap[Int,Int] = {
	  var tabla = new HashMap[Int,Int]
	  1.to(10).foreach(agregarIndice(_,tabla))
	  tabla
	}
	
	def agregarIndice(indice:Int, tabla:HashMap[Int,Int]){
	  tabla.put(indice, cantidadDe(indice))
	}
	
	def cantidadDe(numero:Int):Int={
	  val listaDelNumero= this.notas.filter(_.calificacion == numero)
	  listaDelNumero.foldLeft(0){_+_.calificacion}
	}
	
	def notaMasAltaAlmenosXVeces(cantidad:Int):Int = {
	  val tabla = this.tablaDeNotas()
	  var notasContadas = tabla(10)
	  var notaActual=9
	  while(notasContadas < cantidad && notaActual > 0){
	    notasContadas += tabla(notaActual)
	    notaActual -=1
	  }
	  if(notasContadas >= cantidad){
	    notaActual
	  }else{
	    notaActual//esta mal esto arreglar para que lance excepcion
	}}
	  
	def esAprobada(cursada:Cursada):Boolean= cursada match{
	  case ap:Aprobada => true
	  case _ => false 
	}
	  
	def esAbandonada(cursada:Cursada):Boolean= cursada match{
	  case a:Abandonada => true
	  case _ => false 
	}
	   
	def fueTerminada(cursada:Cursada):Boolean = cursada match{
	  case a:Aprobada => true
	  case d:Desaprobada => true
	  case _ => false
	}  
	  
	def cursadasTerminadas():List[Cursada] = {
	  this.notas.filter(this.fueTerminada(_))
	} 
	   
    def cursadasQueAbandono():List[Cursada] ={
	  this.notas.filter(this.esAbandonada(_))
	} 
	
}